# Cmake实践

# 1.添加Cmake版本
cmake_minimum_required(VERSION 3.1.3)
# 2.声明工程名称
project(odb-test)

# 3.检测并生成框架代码
    # a.添加所需的odb映射到数据结构的代码文件名称
    # 添加依赖哪些代码文件
set(odb_path ${CMAKE_CURRENT_SOURCE_DIR}/entity)    # 文件路径
set(odb_files student.hxx)                          # 具体的文件名称

    # b.检测框架代码是否生成
set(odb_hxx "")     # 临时存放生成的框架代码-odb.hxx
set(odb_cxx "")     # 临时存放生成的框架代码-odb.cxx
set(odb_srcs "")    # 临时存放所有的源码文件 student-odb.cxx

foreach(odb_file ${odb_files})
    # c.如果没有框架文件生成，则预定义生成指令 -- 用于在构建项目之前先生成框架代码

    # 列出目标生成的框架代码文件
    string(REPLACE ".hxx" "-odb.hxx" odb_hxx ${odb_file})
    string(REPLACE ".hxx" "-odb.cxx" odb_cxx ${odb_file})

    # 判断目标文件是否生成 student.hxx  依赖---->  student-odb.hxx student-odb.cxx     (student-odb.ixx student.sql)
    # 生成到一个临时目录下去，也就是执行cmake指令的目录
    if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}${odb_cxx})
        # odb -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time person.hxx
        # 预定义生成指令
        add_custom_command(
            PRE_BUILD
            COMMAND odb
            ARGS -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time ${odb_path}/${odb_file}
            DEPENDS ${odb_path}/${odb_file}
            #指定要生成目标的名称
            OUTPUT 	${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}
            COMMENT "生成ODB框架代码文件:" ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}
        )
    endif()
    # d.将所有生成的框架源码文件名称保存起来
    list(APPEND odb_srcs ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
endforeach()


# 4.获取源码目录source下的所有源码文件
set(src_files "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source src_files)
# 5.声明目标及依赖
# 依赖 main.cc  student-odb.cxx
add_executable(main ${src_files} ${odb_srcs})   
# 6.设置头文件默认搜索路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/entity) # 原有的
include_directories(${CMAKE_CURRENT_BINARY_DIR})        # 新生成的
# 7.设置需要链接的库
target_link_libraries(main -lodb-mysql -lodb -lodb-boost -lgflags)

## 多个服务时
#8. 设置安装路径
INSTALL(TARGETS main RUNTIME DESTINATION bin)

